<?php

// Teacher的文件夹下面的
namespace app\common\model\Teacher;

use think\Model;
// 这里用不了$this->request()，因为$this表示是控制器，request（）表示是控制器下的请求对象，但这里是model而不是控制器。
use think\Request;

// 引入模型
use app\common\model\Subject\Subject;
// 这是引入老师的粉丝表模型。
use app\common\model\Teacher\Follow;


class Teacher extends Model
{
    // 指定模型可操作的表名。操作数据库的一张表，表名为subject_teacher。
    // 假如：把变量名由name换成table,表名也要换：protected $name = "subject_teacher";
    protected $name = "teacher";

    // 开启时间戳。  
    // 需要自动插入时间戳。因为表那里有cteatime,创建时间
    protected $autoWriteTimesamp = true;

    // 插入时间自动写入的字段名。 因为插入是调用save()方法，就会把时间戳自动写入"cteatetime"字段名里面，如果没有这个字段，写入时就会报错。
    protected $createtime = "cteatetime";

    // 更新时候写入字段名。
    // 不需要自动插入时间戳。除了插入的时候会生成时间戳字段，更新的时候也会生成时间戳字段。但是因为列表没有更新时间，所以更新时不需要生成时间戳，所以这里设置为false
    protected $updateTime = false;
    
    // 忽略数据表不存在的字段
    protected $field = true;

    //追加虚拟字段。
    protected $append = [
        // 不能数据库的字段名的名字likes重复，否则会报错。逻辑是，下面方法getLikesTextAttr（）获得数值给到这里的字段follows_text，字段再传到index.html输出
        'follows_text', //粉丝总数
        'avatar_text', //头像
        'count_text' 
    ];

    // 获取器
    // getLikesTextAttr，两边的get和Attr是固定的，中间LikesText是追加属性的自己创建的名字,首字母大写，有下划线也首字母大写。
    // 两个回调参数，只需要$data，
     public function getFollowsTextAttr($value, $data)
    {
        // 查看这个数据库是否有
        $teacherid = isset($data['id']) ? trim($data['id']) : 0;

        // 在上面引入了Follow模型，位置是从同路径的Follow.php引入
        return Follow::where(['teacherid' => $teacherid])->count();

        // // 从$data里面取like字段名。有就取没有就给空
        // // 检查这个模型的数据库data有没有这个follows这个字段，用isset()这个方法。有就拿没有就给空
        // $follows = isset($data['follows']) ? trim($data['follows']) : '';

        // // 如果没有人点赞,返回0
        // if(empty($follows))
        // {
        //     return 0;
        // }

        // //如果有人点赞，字符串转换成数组
        // $arr = explode(',', $follows);

        // return count($arr);
    }

    

    // 获取头像，如果没有就给占位图（占位图）
    // 头像判断的虚拟字段
    public function getAvatarTextAttr($value, $data)
    {
        //第一步，先获取到图片信息
        // 判断整条数据里面有没有这个字段，有就拿，没有就给空
        $avatar = isset($data['avatar']) ? trim($data['avatar']) : '';

        //第二步，判断是否为空。如果为空 或者 图片不存在 给一个默认图
        
        /*在PHP中，is_file 是一个函数，用于检查给定的路径是否是一个存在的文件。".".$avatar 这个表达式会将当前目录（.）与 $avatar 
        变量的值连接起来，形成一个文件路径。is_file 函数会返回一个布尔值，如果 $avatar 指向的路径是一个存在的文件，那么返回 true，
        否则返回 false。如果你想要执行这个检查，完整的代码可能会是这样的：*/
        if(empty($avatar) || !is_file(".".$avatar))
        {
            $avatar = "/assets/img/cover.png";
        }

        /* 这里用不了$this->request()，因为$this表示是控制器，request（）表示是控制器下的请求对象，但这里是model而不是控制器。
        所以，模型中获取的方法是，在上面单独引进来，use think\Request;*/

        //组装完整地址
        // http://www.fast.com/assets/img/cover.png
        
        // 这一句的作用理解为初始化。上面引入"use think\Request;"这里需要引入这句，初始化才可以使用
        $request = Request::instance(); 

        //拿到当前域名www.fast.com。得到$resquest()的方法，domain()方法成功拿到当前域名部分（phpthink手册 p138）
        $domain = $request->domain(); 

        // 拿获得的域名$domain和$avatar（$avatar = "/assets/img/cover.png";）来拼接，再扔回$avatar
        $avatar = $domain.$avatar; 
        return $avatar;

        /* avatar_text虚拟字段的目的:
        增加了一个虚拟字段avatar_text,当avatar==NULL时，就显示虚拟字段的占位图，保证始终有图片显示*/
    }

    //课程总数的虚拟字段
    public function getCountTextAttr($value, $data)
    {
        $id = isset($data['id']) ? trim($data['id']) : 0;

        $SubjectModel = new Subject();

        $count = $SubjectModel->where(['teacherid' => $id])->count();

        return $count;
    }
}
